package ar.edu.utn.frgp.banco.dao.Implements;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import ar.edu.utn.frgp.banco.dao.Interfaces.IntPlazoFijo;
import ar.edu.utn.frgp.banco.dao.connection.ImpConectionHandler;
import ar.edu.utn.frgp.banco.domain.Cliente;
import ar.edu.utn.frgp.banco.domain.Cuenta;
import ar.edu.utn.frgp.banco.domain.PlazoFijo;
import ar.edu.utn.frgp.banco.exceptions.DataAccessException;

public class ImpPlazoFijo implements IntPlazoFijo {

	@Override
	public void AltaPLazoFijo(PlazoFijo plazofijo) throws DataAccessException {
		PreparedStatement ps = null;
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Insert into PlazosFijos (id_cliente, ");
			stringBuilder.append("fechaalta, fechavencimiento, origen,  ");
			stringBuilder.append("id_cuenta_origen, id_cuenta_destino,  ");
			stringBuilder.append("acreditacion, interes, monto) ");
			stringBuilder.append("VALUES (?,?,?,?,?,?,?,?,?)");
			ps = cn.prepareStatement(stringBuilder.toString());

			ps.setInt(1,plazofijo.getId_cliente());
			ps.setDate(2, new java.sql.Date(plazofijo.getFechaAlta().getTime()));
			ps.setDate(3, new java.sql.Date(plazofijo.getFechaVenc().getTime()));
			ps.setString(4,plazofijo.getOrigen());
			ps.setInt(5,plazofijo.getId_cuentaOrigen());
			ps.setInt(6,plazofijo.getId_cuentaDestino());
			ps.setString(7,plazofijo.getAcreditacion());
			ps.setDouble(8,plazofijo.getInteres());
			ps.setDouble(9,plazofijo.getMonto());

			ps.executeUpdate();
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(ps, cn);
		}

	}

	@Override
	public PlazoFijo TraePlazoFijo(Integer id_plazofijo) throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		PlazoFijo plafi = null;
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_plazofijo, id_cliente, ");
			stringBuilder.append("fechaalta, fechavencimiento, origen,  ");
			stringBuilder.append("id_cuenta_origen, id_cuenta_destino,  ");
			stringBuilder.append("acreditacion, interes, monto ");
			stringBuilder.append("from plazosfijos ");
			stringBuilder.append("WHERE id_plazofijo = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, id_plazofijo);
			
			rs = ps.executeQuery();
			
			while (rs.next()) {
				plafi = new PlazoFijo();
				
				plafi.setId_plazofijo(rs.getInt("id_plazofijo"));
				plafi.setId_cliente(rs.getInt("id_cliente"));
				plafi.setFechaAlta(rs.getDate("fechaalta"));
				plafi.setFechaVenc(rs.getDate("fechavencimiento"));
				plafi.setOrigen(rs.getString("Origen"));
				plafi.setId_cuentaOrigen(rs.getInt("id_cuenta_origen"));
				plafi.setId_cuentaDestino(rs.getInt("id_cuenta_destino"));
				plafi.setAcreditacion(rs.getString("acredittacion"));
				plafi.setInteres(rs.getDouble("interes"));
				plafi.setMonto(rs.getDouble("monto"));
				
			}
			
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return plafi;

	}

	@Override
	public List<PlazoFijo> TraePlazoFijosRealizados(Cuenta cuenta)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<PlazoFijo> plazosfijos = new ArrayList<PlazoFijo>();
	
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_plazofijo, id_cliente, ");
			stringBuilder.append("fechaalta, fechavencimiento, origen,  ");
			stringBuilder.append("id_cuenta_origen, id_cuenta_destino,  ");
			stringBuilder.append("acreditacion, interes, monto ");
			stringBuilder.append("from plazosfijos ");
			stringBuilder.append("WHERE id_cuenta_origen = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, cuenta.getID_Cuenta());
			
			rs = ps.executeQuery();
			PlazoFijo plafi = new PlazoFijo(); 
			while (rs.next()) {
				plafi = new PlazoFijo();
				
				plafi.setId_plazofijo(rs.getInt("id_plazofijo"));
				plafi.setId_cliente(rs.getInt("id_cliente"));
				plafi.setFechaAlta(rs.getDate("fechaalta"));
				plafi.setFechaVenc(rs.getDate("fechavencimiento"));
				plafi.setOrigen(rs.getString("Origen"));
				plafi.setId_cuentaOrigen(rs.getInt("id_cuenta_origen"));
				plafi.setId_cuentaDestino(rs.getInt("id_cuenta_destino"));
				plafi.setAcreditacion(rs.getString("acredittacion"));
				plafi.setInteres(rs.getDouble("interes"));
				plafi.setMonto(rs.getDouble("monto"));

				plazosfijos.add(plafi);
				
			}
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return plazosfijos;
	}

	@Override
	public List<PlazoFijo> TraePlazoFijosAcreditados(Cuenta cuenta)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<PlazoFijo> plazosfijos = new ArrayList<PlazoFijo>();
	
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_plazofijo, id_cliente, ");
			stringBuilder.append("fechaalta, fechavencimiento, origen,  ");
			stringBuilder.append("id_cuenta_origen, id_cuenta_destino,  ");
			stringBuilder.append("acreditacion, interes, monto ");
			stringBuilder.append("from plazosfijos ");
			stringBuilder.append("WHERE id_cuenta_destino = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, cuenta.getID_Cuenta());
			
			rs = ps.executeQuery();
			PlazoFijo plafi = new PlazoFijo(); 
			while (rs.next()) {
				plafi = new PlazoFijo();
				
				plafi.setId_plazofijo(rs.getInt("id_plazofijo"));
				plafi.setId_cliente(rs.getInt("id_cliente"));
				plafi.setFechaAlta(rs.getDate("fechaalta"));
				plafi.setFechaVenc(rs.getDate("fechavencimiento"));
				plafi.setOrigen(rs.getString("Origen"));
				plafi.setId_cuentaOrigen(rs.getInt("id_cuenta_origen"));
				plafi.setId_cuentaDestino(rs.getInt("id_cuenta_destino"));
				plafi.setAcreditacion(rs.getString("acredittacion"));
				plafi.setInteres(rs.getDouble("interes"));
				plafi.setMonto(rs.getDouble("monto"));

				plazosfijos.add(plafi);
				
			}
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return plazosfijos;
	}

	@Override
	public List<PlazoFijo> TraePlazoFijos(Cliente cliente)
			throws DataAccessException {
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<PlazoFijo> plazosfijos = new ArrayList<PlazoFijo>();
	
		ImpConectionHandler handler = new ImpConectionHandler();
		Connection cn = handler.getConnection();
		
		try {
			StringBuilder stringBuilder = new StringBuilder();
			stringBuilder.append("Select id_plazofijo, id_cliente, ");
			stringBuilder.append("fechaalta, fechavencimiento, origen,  ");
			stringBuilder.append("id_cuenta_origen, id_cuenta_destino,  ");
			stringBuilder.append("acreditacion, interes, monto ");
			stringBuilder.append("from plazosfijos ");
			stringBuilder.append("WHERE id_cliente = ?");

			ps = cn.prepareStatement(stringBuilder.toString());
			ps.setInt(1, cliente.getID_Cliente());
			
			rs = ps.executeQuery();
			PlazoFijo plafi = new PlazoFijo(); 
			while (rs.next()) {
				plafi = new PlazoFijo();
				
				plafi.setId_plazofijo(rs.getInt("id_plazofijo"));
				plafi.setId_cliente(rs.getInt("id_cliente"));
				plafi.setFechaAlta(rs.getDate("fechaalta"));
				plafi.setFechaVenc(rs.getDate("fechavencimiento"));
				plafi.setOrigen(rs.getString("Origen"));
				plafi.setId_cuentaOrigen(rs.getInt("id_cuenta_origen"));
				plafi.setId_cuentaDestino(rs.getInt("id_cuenta_destino"));
				plafi.setAcreditacion(rs.getString("acreditacion"));
				plafi.setInteres(rs.getDouble("interes"));
				plafi.setMonto(rs.getDouble("monto"));

				plazosfijos.add(plafi);
				
			}
		} catch (SQLException e) {
			throw new DataAccessException(e);
		} finally {
			handler.closeResources(rs, ps, cn);
		}
		return plazosfijos;
	}
}
